home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Node.h
-
- Contains: Tree node class
-
- Owned by: Richard Rodseth
-
- Copyright: © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 5/24/96 jpa 1.1MRD: pragma internal eliminates NOPs.
- Inlined methods.
-
- In Progress:
-
- */
-
- #ifndef _NODE_
- #define _NODE_
-
- #ifndef _ODTYPES_
- #include "ODTypes.h"
- #endif
-
- #ifndef _LINKLIST_
- #include "LinkList.h"
- #endif
-
- //=====================================================================================
- // Classes defined in this interface
- //=====================================================================================
-
- class Node;
- class NodeTraverser;
-
- //=====================================================================================
- // Class Node
- //=====================================================================================
-
- #ifdef PRAGMA_INTERNAL_SUPPORTED
- #pragma internal on
- #endif
-
- class Node : private Link, private LinkedList
- {
- public:
- Node();
- ~Node();
-
- ODULong Size();
-
- Node* GetParent() {return fParent;}
- Node* GetFirstChild() {return (Node*) this->First();}
- Node* GetLastChild() {return (Node*) this->Last();}
- Node* GetNextSibling();
- Node* GetPreviousSibling();
-
- void SetParent(Node* parent) {fParent = parent;}
-
- void AddChildFirst(Node* node) {node->SetParent(this);
- this->AddFirst(node);}
- void AddChildLast(Node* node) {node->SetParent(this);
- this->AddLast(node);}
- void AddChildBefore(Node& existing, Node* node) {node->SetParent(this);
- this->LinkedList::AddBefore(existing, node);}
- void AddChildAfter(Node& existing, Node* node) {node->SetParent(this);
- this->LinkedList::AddAfter(existing, node);}
- void RemoveChild(Node& node) {this->LinkedList::Remove(node);}
- Node* GetChildAfter(Node* node) {return (Node*) this->After(*node);}
- Node* GetChildBefore(Node* node) {return (Node*) this->Before(*node);}
-
- Node* FirstTopDown() {return this;}
- Node* NextTopDown(ODSiblingOrder siblingOrder);
- Node* GetNextAunt(ODSiblingOrder siblingOrder);
-
- Node* FirstBottomUp(ODSiblingOrder siblingOrder);
- Node* NextBottomUp(ODSiblingOrder siblingOrder);
-
- private:
- Node* fParent;
- };
-
- //=====================================================================================
- // Class NodeTraverser
- //=====================================================================================
-
-
- class NodeTraverser
- {
- public:
-
- NodeTraverser(Node* root,
- ODTraversalType traversalType,
- ODSiblingOrder siblingOrder);
- ~NodeTraverser() { }
-
- Node* First();
- Node* Next();
- void SkipChildren();
- ODBoolean IsNotComplete() {return (fCurrent != kODNULL);}
-
- protected:
-
- Node* FirstTopDown(Node* node) {return node;}
- Node* NextTopDown(Node* node, ODSiblingOrder siblingOrder);
- Node* GetNextAunt(Node* node, ODSiblingOrder siblingOrder);
- Node* FirstBottomUp(Node* node, ODSiblingOrder siblingOrder);
- Node* NextBottomUp(Node* node, ODSiblingOrder siblingOrder);
-
- private:
- Node* fRoot;
- Node* fCurrent;
- ODTraversalType fTraversalType;
- ODSiblingOrder fSiblingOrder;
- };
-
- #ifdef PRAGMA_INTERNAL_SUPPORTED
- #pragma internal reset
- #endif
-
- #endif // _NODE_